#include <iostream>
#include <unistd.h>
#include <signal.h>


void PrintfPending(const sigset_t &pending)
{
    std::cout << "curr pending list [" << getpid() << "]: ";
    for (int signo = 31; signo > 0; signo--)
    {
        if(sigismember(&pending, signo))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

void PrintfBlock()
{
    sigset_t set, oset;
    sigemptyset(&set);
    sigemptyset(&oset);

    sigprocmask(SIG_BLOCK, &set, &oset);

    std::cout << "curr block list [" << getpid() << "]: ";
    for (int signo = 40; signo > 0; signo--)
    {
        if(sigismember(&oset, signo))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

void non_handler(int signo)
{

}

int main()
{
    ::signal(2, non_handler);
    //::signal(2, SIG_IGN);

    //1. 对2信号进行屏蔽
    sigset_t block, oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);

    //1.1添加信号
    //只是在用户栈上设置了block的位图结构里，并没有设置进入内核中
    sigaddset(&block, 2);
    sigaddset(&block, 40);
    //1.2 设置进内核中
    sigprocmask(SIG_BLOCK, &block, &oblock);

    int cnt = 0;
    while(true)
    {
        //2.1 打印
        PrintfBlock();
        sleep(1);
        
        // cnt++;
        // if (cnt == 10)
        // {
        //     std::cout << "解除对2号信号的屏蔽" << std::endl;
        //     sigprocmask(SIG_SETMASK, &oblock, nullptr);
        // }
    }

    return 0;
}



// void sigcb(int signo)
// {
//     std::cout << "Get signal number[" << getpid() << "]: " <<signo << std::endl;
// }

// int main()
// {
//     struct sigaction act, oact;
//     act.sa_handler = sigcb;
//     sigaction(SIGINT, &act, &oact);    

//     int cnt = 0;
//     while(true)
//     {
//         sleep(1);
//         std::cout << "cnt: " << cnt << std::endl;
//         cnt++;
//     }
// }


// void sigcb(int signo)
// {
//     std::cout << "Get signal number: " << signo << std::endl;
// }

// int main()
// {
//     ::signal(SIGINT, sigcb);

//     int cnt = 0;
//     while(true)
//     {
//         sleep(1);
//         std::cout << "cnt: " << cnt << std::endl;
//         cnt++;
//     }
// }